/**
    Promise.finally 方法
    自己实现concat方法
    commonjs规范 总结 （module.exports exports）
    https://ks.wjx.top/jq/33799145.aspx
*/
Promise.prototype.finally = function(callback) {
    return this.then(data => {
        cb();
        return data;
    }, err => {
        cb();
        throw err;
    })
}

Buffer.concat = function (list, totalLength = list.reduce((a, b) => a + b.length, 0)) {
  // 创建一个buffer  把每个buffer 拷贝进去
  let buf = Buffer.alloc(totalLength);
  let offset = 0;
  list.forEach((b) => {
    b.copy(buf, offset);
    offset += b.length;
  });
  return buf;
}

/*
## commonjs require方法的实现
- 内置实现了一个require方法
- 通过Module._load 方法 加载模块
- Module._resolveFilename  根据相对路径转化成绝对路径 并且增加后缀
- 模块的缓存问题 Module._cache
- new Module 创建模块  id 存的是名字 exports ＝ {}  this
- tryModuleLoad(module) 尝试加载这个模块
    - 取出文件的后缀
    - 加载模块 （读取文件）
    - Module.wrap 包裹读取的内容
    - 使用runInthisContext 运行字符串
    - 让字符串执行 this改编成 exports
*/